package com.hwg.shiliupro.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

//ApplicationContextAware接口是用来获取框架自动初始化的ioc容器对象的。
//ApplicationContext代表IOC容器，在SpringIOC容器中读取Bean配置创建Bean实例之前，必须对它进行实例化，
// 只有在容器实例化后才可以从IOC容器里获取Bean实例并使用。
@Slf4j
@Component
@Lazy(value = false)
public class ApplicationContextUtil implements ApplicationContextAware {
    // 定义静态ApplicationContext
    private static ApplicationContext applicationContext;

    /**
     * 重写接口的方法,该方法的参数为框架自动加载的IOC容器对象
     * 该方法在启动项目的时候会自动执行,前提是该类上有IOC相关注解,例如@Component
     * @param applicationContext ioc容器
     * @throws BeansException e
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 将框架自动加载的ioc容器赋值给全局静态ioc容器
        ApplicationContextUtil.applicationContext = applicationContext;
        log.info("Util的ApplicationContext加载成功");
    }


    /**
     * 获取应用上下文  IOC容器
     *
     * @return {@link ApplicationContext}
     */
    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }

    /**
     * 通过bean的名字来获取bean
     *
     * @param beanName bean名字
     * @return {@link Object}
     */
    public static Object getBean(String beanName){
        return getApplicationContext().getBean(beanName);
    }

//    public static T getBean (Class<T> clazz){
//        return applicationContext
//    }
// 通过name获取 Bean.
//    public static Object getBean(String name) {
//        return getApplicationContext().getBean(name);
//    }
//    // 通过class获取Bean.
//    public static <T> T getBean(Class<T> clazz) {
//        return getApplicationContext().getBean(clazz);
//    }
//    // 通过name,以及Clazz返回指定的Bean
//    public static <T> T getBean(String name, Class<T> clazz) {
//        return getApplicationContext().getBean(name, clazz);
//    }



}
